#####################################################
#####################################################
## Seminář o práci v R Studiu - Část první
##
## Základy
#####################################################
#####################################################

# Program:
# 1. R jako kalkulačka
# 2. Objekty
# 3. Datové struktury
# 4. Výběr elementů
# 5. Práce s datovými sety
# 6. Export a import dat
# 7. Výpočet průměru a dalších charakteristik
# 8. Další užitečné funkce
# 9. Práce s R





###################################################
## Úvodní poznámky
###################################################

# Toto je jednoduchý textový soubor.
# Soubor má koncovku ".R", takže víme, že jde o R skript.
# V případě, že je soubor nečitelný, je třeba zvolit jiné kódování: 
# File -> Reopen with Encoding... -> UTF-8

# V R konzoli níže je možné vykonat příkazy přímo,
# nebo je napsat zde a poslat je do konzole pomocí Command + Enter (Mac) či Ctrl + Enter (Windows).
# Preferujeme druhou metodu! Umožňuje totiž uložení skriptu.
# Do konzole můžeme posílat jednotlivé řádky, několik řádků nebo třeba i celý soubor.

# "#" jsou označení pro začátky komentářů, které nejsou interpretovány jako R kód.



###################################################
## 1. R jako kalkulačka
###################################################

1+1 # sčítání

3-1 # odečítání

2*5 # násobení

8/2 # dělení

2^3 # mocniny

16^(1/2) # odmocniny


# Používáme funkce:
sqrt(16) # funkce potřebují zadání v ()

round(10.238)

# Můžeme se podívat, jak má být zadání strukturováno:
help(round)

round(10.238, digits=1) # "digits" je argument
round(10.238, 1)        # stejné zadání jako v předchozím případě
round(digits=1,x=10.238)


###################################################
## 2. Objekty
###################################################

a <- 1    # 'a' je objekt

# V pracovním prostředí můžeme mít najednou několik objektů.
b <- 3
c <- "Hello"
d <- TRUE

# Všechny současné objekty v pracovním prostředí  můžeme zobrazit:
ls()

# Objekty lze i odstranit:
rm(a)  # odstraň "a"
  
rm(list=ls()) # odstraň vše z pracovního prostředí (dvojitá funkce!)
help(rm)

# R používá 4 základní typy objektů:
a <- FALSE          # logické (logical)
b <- 2.45           # numerické (numeric)
c <- as.integer(4)  # celá čísla (integer)
d <- "sun"          # textové (character)

class(a)
class(b)
class(c)
class(d)

rm(list=ls())



###################################################
## 3. Datové struktury
###################################################

# Různé typy objektů obsahují různé typy dat:
# skalár ("scalar"): číslo, znak, nebo logická hodnota (takové objekty jsme vytvořili výše),
# vektor ("vector"): sada skalárů,
# matice ("matrix"): dvojdimenzionální sada skalárů stejného (!) typu,
# datový set ("data frame"): kolekce vektorů (potenciálně) různých (!) typů, ale stejné délky,
# sada skalárů ("array"): vícedimenzionální sada skalárů,
# list ("list"): kombinace skalárů, vektorů, matic...

# Zkusme vektory:
# Několik hodnot je zkombinováno pomocí "c()".
a <- c(1,2,3)
a

# Stejný princip funguje pro textové objekty.
country <- c("DE", "FR", "NL")
country

# Můžete použít funkce pro každý element ve vektoru, matici apod.
sqrt(a)
  
d <- a+2
  
log(country) # R nás upozorní na chyby - ovšem pouze když odporuje jeho zákonům!
  
# Zkusme matice:
help(matrix)
mat <- matrix(data = NA, nrow = 3, ncol = 9) # "NA" (not available) značí prázdné pole
mat
  
nrow(mat) # počet řádků, neboli pozorování
ncol(mat) # počet sloupců, neboli proměnných

rm(list=ls())

###################################################
##  Cvičení I: Vytvořte tři objekty.
	  #   a) Objekt "a" bude obsahovat číslo pí (pokyn: pi).
	  #   b) Objekt "b" bude obsahovat čísla od 1 do 3.
	  #   c) Objekt "c" bude obsahovat násobky pí od 1 do 3.





a <- pi
b <- c(1:3)
c <- a*b



###################################################
## 4. Výběr elementů
###################################################

rm(list=ls())

# Elementy objektů vybíráme pomocí [].

a <- c(10:12)
a
a[3]
a[1:3]
a[-3]
a[c(1,3)]
a[c(-1,-3)]

# Výběr elementů z matice:
m <- matrix(data = c(a,a+5), nrow = 3, ncol = 2)
m
m[1,1]
m[2,]
m[,2] # první se uvádí číslo řádku, potom číslo sloupce - pomůcka "Roman Catholics" (row, column)

# Můžeme také použít [], abychom vyměnili konkrétní elementy.
m[1,1] <- 0
m[2,] <- 0
m


# Výběr elementů na základě podmínek.
# Dostupné podmínky:
  # == "rovná se"
  # != "nerovná se"
  # < "je menší"
  # > "je větší"
  # <= "je menší nebo rovno"
  # => "je větší nebo rovno"
 
# Může být zkombinováno s logickými argumenty:
  # & "a"
  # | "nebo"
 
x <- c(1,56,23,89,-3,5)
y <- c(24,78,32,27,8,1)  	


x[x > 20]             # výběr x, které je větší než 20
x[x >= 23]            # výběr x, které je větší nebo rovno 23
x[x > 20 & x != 89]   # výběr x, které je větší než 20 a nerovná se 89
x[x > 0 | x != -3]    # výběr x, které je větší než 0 nebo x, které se nerovná -3
y[x == 1]             # výběr y, když se x rovná 1
 

###################################################
##  Cvičení II: Výběr elementů x,
    #   a) které jsou větší než 5 nebo menší než 0.
 	  #   b) Změňte x na nulu pokud je y větší než 26 a menší nebo rovno 32.



  
  
x[x>5 | x<0]
x[y>26 & y<=32] <- 0



###################################################
## 5. Práce s datovými sety
###################################################

rm(list = ls())

var1 <- c(17.87,25.34,25.3,16.73,25.75)
var2 <- c(95,80.40,90.6,60.54,0.000)
var3 <- c(0,4.43,55.556,86.00,76.190)

dat <- data.frame(var1,var2,var3)
names(dat)
dat

# Výběr pomocí numerické pozice.
dat[1,2]
dat[1:3,2]

# Výběr pomocí názvu sloupce.
dat[1,"var2"]
dat[ ,"var2"]

# Výběr pomocí názvu proměnné.
dat$var2

# Se sloupci můžeme nakládat jako s vektory.
dat[1,2]
dat$var2[1] # stejný výběr

# Můžeme vytvářet nové proměnné.
dat$var4 <- dat$var2 + dat$var3

# Přejmenování sloupců:
colnames(dat)
colnames(dat) <- c("ODS","ANO","KSCM","STAN")
colnames(dat)[3] <- "KDU"



###################################################
## 6. Export a import dat
###################################################

# Odhalení pracovní složky ("working directory"):
getwd()

# Při práci s R se při otevření skriptu automaticky kód spáruje s příslušnou složkou.
# Pokud byste ale následně otevřeli jiný skript z jiné složky, R pořád bude pracovat s tou první.
# Je proto nutné po každém ukončení práce na skriptu zavřít celý program,
# nebo je třeba nastavovat pracovní složku pomocí funkce setwd().

# Pro použití některých funkcí musíme nejprve nahrát příslušnou knihovnu funkcí:
library(foreign)  # knihovna pro export/import

# Stata datové soubory
write.dta(dat, file="data.dta") # tímto exportujeme datový set do pracovní složky
list.files()
rm(dat)
dat <- read.dta("data.dta") # tímto způsobem datový set importujeme zpět

# CSV
write.csv(dat, file="data.csv", row.names = F) # export je možné provádět i v dalších formátech
list.files()
rm(dat)
dat <- read.csv("data.csv") # import dat

# SPSS
install.packages("haven") # někdy je třeba nainstalovat nový balíček funkcí
library(haven)
write_sav(dat, path = "dat.sav")
list.files()
rm(dat)
dat <- read_spss("dat.sav") # import dat



###################################################
## 7. Výpočet průměru a dalších charakteristik
###################################################

rm(list=ls())
dat <- read.dta("data.dta")
colnames(dat) <- c("var1","var2","var3","var4")

# Výpočet průměru:
mean(dat$var1)

# Pokud to jde, používáme co nejvíce obecný zápis.
# V případě jakékoliv změny pak totiž kód stále funguje.


# Ostatní funkce:
median(dat$var1) # medián
var(dat$var1) # rozptyl
sqrt(var(dat$var1)) # odmocnina
sd(dat$var1) # standardní odchylka
range(dat$var1) # rozpětí

# A tak dále - většina statistických funkcí existuje - je třeba jen znát jejich název.



###################################################
## 8. Další užitečné funkce
###################################################

# Řazení:
sort(c(0,7,8,3,4,9))

# Opakované zapisování:
rep(1,7)

# Délka objektů:
length(c(8,9,4,5,6))

# Přehled objektu:
table(c(1,1,2,3,4,5,5,5,6,6,7,9,9,9,9,9))

# Unikátní hodnoty objektu:
unique(c(1,1,2,3,4,5,5,5,6,6,7,9,9,9,9,9))

# Kombinace textů:
paste0(c("ČSSD","ODS","KSČM","ANO"),"2014")
paste(c("ČSSD","ODS","KSČM","ANO"),"2014")

# Výběr textu:
substr("Číslo schůze: 36",15,16)

# Kontrola obsahu textu:
grepl("doporučuje","Toto je text schůze, který se doporučuje")

# Délka textu:
nchar("Petr Pan")

# Transformace objektů:
as.integer("2")
as.integer(2.86)
as.numeric(2)
as.character(367)

# A mnoho dalších...



###################################################
## 9. Práce s R
###################################################

# Náš skript máme uložený - je to textový soubor, ale koncovka .R odkazuje právě na R.

# Uložit ale můžeme i celé pracovní prostředí
save(list = ls(), file= "seminar1.RData")
list.files()
rm(list = ls())
load("seminar1.RData")

# Často bude nutné nainstalovat příslušný balíček funkcí.
# POZOR!!! Pro instalaci balíčků je třeba R alespoň jednou otevřít jako správce.
# V některých případech může být také nutné nainstalovat nejnovější verzi Java:
# https://www.java.com/en/download/manual.jsp - na moderních počítačích instalace 64-bitové verze Java.


# Existují i velmi zábavné balíčky:
install.packages("cowsay") # https://cran.r-project.org/web/packages/cowsay/index.html 
library(cowsay)
say("ahoj", by = "shark")

# Instalovat balíky stačí jenom jednou, nahrát je ale musíte pokaždé při zapnutí R.

# Proto je dobré každý skript začít následujícími jednotnými příkazy:

rm(list = ls())
load("seminar1.RData")

save(list = ls(), file= "seminar1.RData")

getwd()

rm(list = ls())
rm()

install.packages("cowsay")

library(foreign)
library(cowsay)

# Dále už pak následují analýzy...





# Pomůcka: např. Quick-R [http://www.statmethods.net], Stack Overflow [https://stackoverflow.com] a další.
# Podívejte se i jinde na webu na další návody. Nebojte se googlit... Musíte googlit...
# Na Facebooku sledujte například "R bloggers".

# Používejte komentáře (#) k rozdělení a popisu kódu.
# Cílem je, aby byl přehledný a pochopitelný pro vás i ostatní.

# Používejte RStudio pro lepší práci s R. Co nejméně používejte klikací funkce - pište příkazy.
# Veškerý kód musí být zapsán ve skriptu tak, aby bylo možné postup replikovat.
# Pravděpodobně budete chtít použít kód v budoucnosti, takže ho uložte.




